

function Vue({data,methods}) {

    var _data = data();

    Dep.target = new Watcher()

    observe(_data)

    for (var i in _data) {
    
        this[i] = _data[i]
    
    }

    
    for (var i in methods) {
    
        this[i] = methods[i]
    
    }
    
}


// 给一个对象 批量设置 defineReative
function observe(obj){
    
    for (var i in obj) {
    
        defineReactive(obj,i,obj[i])
        
    }

}

// 给每个属性设置 set get
function defineReactive(obj,key,value) {

    var dep = new Dep()

    Object.defineProperty(obj,key,{

        // 别人读取属性时，收集依赖
        get(){

            dep.addSub(Dep.target)

            return value

        },

        // 别人更新属性时，触发依赖更新
        set(newVal,oldValue){

            value = newVal

            dep.notify()

        }

    })
    
}

// 给每个属性新增一个保存 watcher 实例的地方
class Dep{

    constructor(){

        this.subs=[] // 读取了这个属性的所有实例

    }

    // 保存实例
    addSub(target){

        this.subs.push(target)

    },

    notify(){

        for (var i = 0, len = this.subs.length; i < len; i++) {
            
            var watcher = this.subs[i]

            watcher.update()
        
        }
    }

}

class Watcher{

    constructor(){

        this.deps=[]

        // 新建实例的时候，
        Dep.target= this

    }

    addDep(){
        this.deps.push()
    }


    update(){

    }

}



var a = new Vue({
    data(){
        return {
            a:"bbbb"
        }
    },
    methods:{
        getName(){
            console.log("name-----",this.a)
        }
    }
})

console.log('Vue--->',a.getName(),);